fn main() {
    // -------------------    let关键字 ---------------
    // let x = 5;
    // x = 6;   let 声明的变量默认是 不可变的 ，所以不能绑定2次值

    // mut 声明变量是可变的
    let mut x = 5;

    println!("x=:{}", x);

    x = 6;

    println!("x=:{}", x);

    // -------------------   常量   -----------------------

    // 使用const声明常量, 必须显示的表明 常量的数据类型和初始化值
    const Y: i32 = 10;

    println!("y=:{}", Y);

    const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

    println!("3小时的秒数:{}", THREE_HOURS_IN_SECONDS);

    // -----------------  shadowing ----------

    // 变量名前面使用下划线是为了告诉编译器故意让_a的第一个值未使用，否则会告警
    let _a = 10;
    // 重复使用 let 关键字 和同样的变量名，可以将该变量重新绑定到一个新的值
    let _a = 12;
    {
        //  在花括号里，重新绑定 _a的值为字符串"hello" ,当花括号结束时，_a的值会变回之前的值
        let _a = "hello";
        println!("_a={}", _a);
    }

    println!("_a={}", _a);

    // 必须指定s的数据类型，否则编译报错
    let s: i32 = "123".parse().expect("解析错误");
    println!("s={}", s);
}
